// vite.config.ts
import { defineConfig, loadEnv } from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite@4.1.3_@types+node@18.14.0_less@4.1.3_terser@5.26.0/node_modules/vite/dist/node/index.js";
import vue from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/@vitejs+plugin-vue@4.0.0_vite@4.1.3_vue@3.2.47/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import { resolve } from "path";
import VueSetupExtend from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite-plugin-vue-setup-extend@0.4.0_vite@4.1.3/node_modules/vite-plugin-vue-setup-extend/dist/index.mjs";
import vueJsx from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/@vitejs+plugin-vue-jsx@3.1.0_vite@4.1.3_vue@3.2.47/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
import AutoImport from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-auto-import@0.16.7_@vueuse+core@10.7.1/node_modules/unplugin-auto-import/dist/vite.js";
import Components from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-vue-components@0.25.2_vue@3.2.47/node_modules/unplugin-vue-components/dist/vite.mjs";
import { AntDesignVueResolver } from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-vue-components@0.25.2_vue@3.2.47/node_modules/unplugin-vue-components/dist/resolvers.mjs";
import checker from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite-plugin-checker@0.6.2_typescript@4.9.5_vite@4.1.3_vue-tsc@1.1.5/node_modules/vite-plugin-checker/dist/esm/main.js";

// src/plugins/svgBuilder.js
import { readFileSync, readdirSync } from "fs";
var idPerfix = "";
var svgTitle = /<svg([^>+].*?)>/;
var clearHeightWidth = /(width|height)="([^>+].*?)"/g;
var hasViewBox = /(viewBox="[^>+].*?")/g;
var clearReturn = /(\r)|(\n)/g;
function findSvgFile(dir) {
  var _a2, _b2, _c2;
  const svgRes = [];
  const dirents = readdirSync(dir, {
    withFileTypes: true
  });
  for (const dirent of dirents) {
    if (dirent.isDirectory()) {
      svgRes.push(...findSvgFile(dir + dirent.name + "/"));
    } else {
      const svg = (_c2 = (_b2 = (_a2 = readFileSync(dir + dirent.name).toString()) == null ? void 0 : _a2.replace(clearReturn, "")) == null ? void 0 : _b2.replace(svgTitle, ($1, $2) => {
        var _a3;
        let width = 0;
        let height = 0;
        let content = $2 == null ? void 0 : $2.replace(clearHeightWidth, (s1, s2, s3) => {
          if (s2 === "width") {
            width = s3;
          } else if (s2 === "height") {
            height = s3;
          }
          return "";
        });
        if (!hasViewBox.test($2)) {
          content += `viewBox="0 0 ${width} ${height}"`;
        }
        return `<symbol id="${idPerfix}-${(_a3 = dirent.name) == null ? void 0 : _a3.replace(
          ".svg",
          ""
        )}" ${content}>`;
      })) == null ? void 0 : _c2.replace("</svg>", "</symbol>");
      svgRes.push(svg);
    }
  }
  return svgRes;
}
var svgBuilder = (path, perfix = "icon") => {
  if (path === "")
    return;
  idPerfix = perfix;
  const res = findSvgFile(path);
  return {
    name: "svg-transform",
    transformIndexHtml(html) {
      return html == null ? void 0 : html.replace(
        "<body>",
        `
          <body>
            <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
              ${res.join("")}
            </svg>
        `
      );
    }
  };
};

// src/utils/tools.ts
function formatFileSize(size, pointLength = 2) {
  if (size < 1024) {
    return size + "B";
  } else if (size < 1024 * 1024) {
    return (size / 1024).toFixed(pointLength) + "KB";
  } else {
    return (size / 1024 / 1024).toFixed(pointLength) + "MB";
  }
}

// src/plugins/tinifyImg.ts
import { readFile, stat } from "fs";
import { createHash } from "crypto";
import sharp from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/sharp@0.33.2/node_modules/sharp/lib/index.js";
var hashConnect = "-";
var hashLength = 8;
var isNeedHash = true;
var assetsInlineLimit = 4096;
var imgFileMap = {};
var imageRegex = /\.(png|jpe?g|gif|webp)$/i;
function generateHash(content) {
  return createHash("sha256").update(content).digest("hex");
}
function getFileExt(filePath) {
  return filePath.split(".").pop();
}
function getFileName(filePath) {
  return filePath.split("/").pop();
}
function generateHashFileName(filePath, isConnectHash, hashLen, hash) {
  const fileName = getFileName(filePath);
  const ext = getFileExt(fileName);
  return isConnectHash ? `${fileName.replace(`.${ext}`, "")}${hashConnect}${hash.slice(
    0,
    hashLen
  )}.${ext}` : `${fileName.replace(`.${ext}`, "")}.${ext}`;
}
function getFileSize(filePath) {
  return new Promise((resolve2) => {
    stat(filePath, (err, stats) => {
      if (err)
        resolve2(void 0);
      resolve2(stats.size);
    });
  });
}
function readFileContent(filePath) {
  return new Promise((resolve2) => {
    readFile(filePath, (err, data) => {
      if (err)
        resolve2(void 0);
      resolve2(data);
    });
  });
}
function formatterLog(filePath, sizeBefore, sizeAfter) {
  console.log(
    "\n\x1B[34m",
    `\u3010${filePath}\u3011\u538B\u7F29\u6210\u529F`,
    "\x1B[0m",
    "\x1B[31m",
    sizeBefore,
    "\x1B[0m",
    "===>",
    "\x1B[32m",
    sizeAfter,
    "\x1B[0m"
  );
}
function tinifyImg(imgFile) {
  const { size, url: filePath } = imgFile;
  const ext = getFileExt(filePath);
  return new Promise((resolve2) => {
    switch (ext) {
      case "png":
        sharp(filePath, { limitInputPixels: false }).png({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "jpeg":
        sharp(filePath, { limitInputPixels: false }).jpeg({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "gif":
        sharp(filePath, { animated: true, limitInputPixels: false }).gif({ interFrameMaxError: 10, colours: 200 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "webp":
        sharp(filePath, { limitInputPixels: false }).webp({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      default:
        resolve2(void 0);
    }
  });
}
var tinifyImg_default = () => {
  return {
    name: "vite-plugin-tinify-image",
    enforce: "pre",
    // 在其他插件处理之前，先处理
    apply: "build",
    // 只在生产环境构建时启用
    async configResolved(config) {
      var _a2, _b2, _c2;
      assetsInlineLimit = config.build.assetsInlineLimit;
      const assetFileNames = (_c2 = (_b2 = (_a2 = config == null ? void 0 : config.build) == null ? void 0 : _a2.rollupOptions) == null ? void 0 : _b2.output) == null ? void 0 : _c2.assetFileNames;
      if (assetFileNames) {
        if (/\[hash:?(\d*)\]/.test(assetFileNames)) {
          hashConnect = "";
          assetFileNames.replace(
            /\[name\](.)\[hash:?(\d*)\]/,
            (match, $1, $2) => {
              hashConnect = $1;
              hashLength = Number($2) || 8;
              return "";
            }
          );
        } else {
          isNeedHash = false;
          hashConnect = "";
        }
      } else {
        hashConnect = "-";
      }
    },
    async load(id) {
      if (imageRegex.test(id)) {
        const size = await getFileSize(id);
        if (size && size > assetsInlineLimit) {
          const res = await readFileContent(id);
          if (res) {
            imgFileMap[generateHashFileName(
              id,
              isNeedHash,
              hashLength,
              generateHash(res)
            )] = {
              size: formatFileSize(size),
              url: id
            };
          }
        }
      }
    },
    async generateBundle(_options, bundle) {
      console.log("\n===============\u5F00\u59CB\u56FE\u7247\u538B\u7F29==============");
      for (const key in bundle) {
        if (imageRegex.test(key)) {
          const fileName = getFileName(key);
          if (fileName && imgFileMap[fileName]) {
            const res = await tinifyImg(imgFileMap[fileName]);
            if (res) {
              bundle[key].source = res;
            }
          }
        }
      }
      console.log("\n===============\u5B8C\u6210\u56FE\u7247\u538B\u7F29==============");
    }
  };
};

// src/config/proxyAddress.txt?raw
var proxyAddress_default = "https://maps.googleapis.com";

// src/config/system.ts
var getNowDate = () => {
  var date = new Date();
  var sign2 = ":";
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  var hour = date.getHours();
  var minutes = date.getMinutes();
  var seconds = date.getSeconds();
  var weekArr = [
    "\u661F\u671F\u5929",
    "\u661F\u671F\u4E00",
    "\u661F\u671F\u4E8C",
    "\u661F\u671F\u4E09",
    "\u661F\u671F\u56DB",
    "\u661F\u671F\u4E94",
    "\u661F\u671F\u516D"
  ];
  var week = weekArr[date.getDay()];
  if (month >= 1 && month <= 9)
    month = "0" + month;
  if (day >= 0 && day <= 9)
    day = "0" + day;
  if (hour >= 0 && hour <= 9)
    hour = "0" + hour;
  if (minutes >= 0 && minutes <= 9)
    minutes = "0" + minutes;
  if (seconds >= 0 && seconds <= 9)
    seconds = "0" + seconds;
  return year + "-" + month + "-" + day + " " + hour + sign2 + minutes + sign2 + seconds + " " + week;
};

// vite.config.ts
var __vite_injected_original_dirname = "E:\\\u6781\u5149\u65FB\\im_backstage";
var _a, _b, _c;
var proxyAddressArr = (_c = (_b = (_a = proxyAddress_default) == null ? void 0 : _a.split) == null ? void 0 : _b.call(_a, "\r\n")) == null ? void 0 : _c.map((url) => url.trim());
var vite_config_default = defineConfig(async ({ command, mode }) => {
  var _a2;
  const config = loadEnv(mode, process.cwd());
  const environment = config.VITE_ENV;
  const isProduction = environment !== "development.dev";
  const proxy_address = (env, url = "") => {
    switch (env) {
      case "development.dev":
        return url || config.VITE_URL;
      case "development.test":
        return url || config.VITE_URL;
      case "development.prod":
        return url || config.VITE_URL;
    }
  };
  const getPort = (env) => {
    switch (env) {
      case "development.dev":
        return 3005;
      case "development.local":
        return 3006;
      case "development.test":
        return 3009;
      case "development.prod":
        return 3010;
    }
  };
  const port = getPort(environment);
  console.log("\u7CFB\u7EDF\u66F4\u65B0\u65F6\u95F4", getNowDate());
  return {
    define: {
      __APP_VERSION__: JSON.stringify("v1.2.5"),
      __APP_BRANCH__: JSON.stringify((_a2 = mode == null ? void 0 : mode.split) == null ? void 0 : _a2.call(mode, ".")[1]),
      __APP_UPDATE_TIME__: JSON.stringify(getNowDate())
    },
    envPrefix: "VITE_",
    base: environment === "development.dev" ? "/" : "/",
    productionSourceMap: !isProduction,
    build: {
      outDir: "dist",
      assetsDir: "assets",
      sourcemap: false,
      minify: "terser",
      chunkSizeWarningLimit: 1024 * 10,
      terserOptions: {
        output: {
          comments: true
        },
        compress: {
          drop_console: true,
          drop_debugger: true
        }
      },
      rollupOptions: {
        output: {
          // 静态资源分类打包
          chunkFileNames: "assets/js/[name]-[hash].js",
          entryFileNames: "assets/js/[name]-[hash].js",
          assetFileNames: "assets/[ext]/[name]-[hash].[ext]",
          manualChunks: (id) => {
            if (id.includes("node_modules")) {
              if (id.includes("ant-design-vue")) {
                return "ant-dsign-vue";
              }
              if (id.includes("@ant-design/icons-vue")) {
                return "@ant-design/icons-vue";
              }
              if (id.includes("echarts")) {
                return "echarts";
              }
              if (id.includes("lodash")) {
                return "lodash";
              }
              if (id.includes("moment-timezone")) {
                return "moment-timezone";
              }
              if (id.includes("axios")) {
                return "axios";
              }
              if (id.includes("dayjs")) {
                return "dayjs";
              }
              if (id.includes("pinia")) {
                return "pinia";
              }
              if (id.includes("vod-js-sdk-v6")) {
                return "vod-js-sdk-v6";
              }
            }
          }
        }
      }
    },
    server: {
      https: false,
      open: false,
      cors: true,
      port,
      host: "0.0.0.0",
      proxy: {
        "/maps/api": {
          target: proxyAddressArr[0],
          changeOrigin: true,
          rewrite: (path) => {
            var _a3;
            return (_a3 = path == null ? void 0 : path.replace) == null ? void 0 : _a3.call(path, /^\/maps\/api/, "/maps/api");
          }
        },
        "/api": {
          target: proxy_address(environment),
          changeOrigin: true,
          rewrite: (path) => {
            var _a3;
            return (_a3 = path == null ? void 0 : path.replace) == null ? void 0 : _a3.call(path, /^\/api/, "");
          }
        }
      }
    },
    css: {
      preprocessorOptions: {
        less: {
          modifyVars: {
            hack: `true; @import (reference) "${resolve(
              "src/assets/css/base.less"
            )}";`
          },
          javascriptEnabled: true
        }
      }
    },
    resolve: {
      alias: {
        "@views": resolve(__vite_injected_original_dirname, "src/views"),
        "~/": `${resolve(__vite_injected_original_dirname, "src")}/`,
        "@": resolve(__vite_injected_original_dirname, "src"),
        "@assets": resolve(__vite_injected_original_dirname, "src/assets"),
        "@components": resolve(__vite_injected_original_dirname, "src/components"),
        "@images": resolve(__vite_injected_original_dirname, "src/assets/images"),
        "@store": resolve(__vite_injected_original_dirname, "src/store")
      }
    },
    plugins: [
      vue(),
      vueJsx(),
      VueSetupExtend(),
      // 自动导入api
      AutoImport({
        imports: [
          "vue",
          "vue-router",
          "pinia",
          {
            vue: ["createVNode", "defineExpose", "withModifiers"],
            "ant-design-vue": ["message", "Modal", "notification"]
          }
        ],
        include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/],
        eslintrc: {
          enabled: false,
          filepath: "./.eslintrc-auto-import.json",
          globalsPropValue: true
        },
        vueTemplate: true,
        dirs: [
          "./src/api",
          "./src/config",
          "./src/store",
          "./src/assets/types",
          "./src/assets/validate",
          "./src/assets/js",
          "./src/assets/hoc"
        ],
        dts: "./src/types/auto-imports.d.ts",
        resolvers: [AntDesignVueResolver()]
      }),
      // 自动导入组件
      Components({
        dts: "./src/types/components.d.ts",
        dirs: [],
        extensions: ["vue", "jsx", "tsx", "ts", "js"],
        // 按需导入组件配置只在模版语法中生效
        resolvers: [
          AntDesignVueResolver({ importStyle: true, resolveIcons: true })
        ]
      }),
      svgBuilder("./src/assets/icons/svg/"),
      tinifyImg_default(),
      checker({
        vueTsc: true
      })
    ]
  };
});
export {
  vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAic3JjL3BsdWdpbnMvc3ZnQnVpbGRlci5qcyIsICJzcmMvdXRpbHMvdG9vbHMudHMiLCAic3JjL3BsdWdpbnMvdGluaWZ5SW1nLnRzIiwgInNyYy9jb25maWcvc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS92aXRlLmNvbmZpZy50c1wiO2ltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiB9IGZyb20gXCJ2aXRlXCI7XHJcbmltcG9ydCB2dWUgZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IFZ1ZVNldHVwRXh0ZW5kIGZyb20gXCJ2aXRlLXBsdWdpbi12dWUtc2V0dXAtZXh0ZW5kXCI7XHJcbmltcG9ydCB2dWVKc3ggZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZS1qc3hcIjtcclxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIjtcclxuaW1wb3J0IENvbXBvbmVudHMgZnJvbSBcInVucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGVcIjtcclxuaW1wb3J0IHsgQW50RGVzaWduVnVlUmVzb2x2ZXIgfSBmcm9tIFwidW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvcmVzb2x2ZXJzXCI7XHJcbmltcG9ydCBjaGVja2VyIGZyb20gXCJ2aXRlLXBsdWdpbi1jaGVja2VyXCI7XHJcbmltcG9ydCB7IHN2Z0J1aWxkZXIgfSBmcm9tIFwiLi9zcmMvcGx1Z2lucy9zdmdCdWlsZGVyLmpzXCI7XHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHRpbmlmeUltZyBmcm9tIFwiLi9zcmMvcGx1Z2lucy90aW5pZnlJbWcudHNcIjtcclxuLy8gQHRzLWlnbm9yZVxyXG5pbXBvcnQgcHJveHlBZGRyZXNzIGZyb20gXCIuL3NyYy9jb25maWcvcHJveHlBZGRyZXNzLnR4dD9yYXdcIjtcclxuLy8gQHRzLWlnbm9yZVxyXG5pbXBvcnQgeyBnZXROb3dEYXRlIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy9zeXN0ZW0udHNcIjtcclxuXHJcbmNvbnN0IHByb3h5QWRkcmVzc0FyciA9IHByb3h5QWRkcmVzcz8uc3BsaXQ/LihcIlxcclxcblwiKT8ubWFwKCh1cmwpID0+IHVybC50cmltKCkpO1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKHsgY29tbWFuZCwgbW9kZSB9KSA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gbG9hZEVudihtb2RlLCBwcm9jZXNzLmN3ZCgpKTtcclxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZy5WSVRFX0VOVjtcclxuICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBlbnZpcm9ubWVudCAhPT0gXCJkZXZlbG9wbWVudC5kZXZcIjtcclxuICBjb25zdCBwcm94eV9hZGRyZXNzOiBhbnkgPSAoZW52LCB1cmwgPSBcIlwiKSA9PiB7XHJcbiAgICBzd2l0Y2ggKGVudikge1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQuZGV2XCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC50ZXN0XCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC5wcm9kXCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBnZXRQb3J0OiBhbnkgPSAoZW52KSA9PiB7XHJcbiAgICBzd2l0Y2ggKGVudikge1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQuZGV2XCI6XHJcbiAgICAgICAgcmV0dXJuIDMwMDU7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC5sb2NhbFwiOlxyXG4gICAgICAgIHJldHVybiAzMDA2O1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQudGVzdFwiOlxyXG4gICAgICAgIHJldHVybiAzMDA5O1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQucHJvZFwiOlxyXG4gICAgICAgIHJldHVybiAzMDEwO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgcG9ydCA9IGdldFBvcnQoZW52aXJvbm1lbnQpO1xyXG5cclxuICAvLyBcdTY4M0NcdTVGMEZcdTUzMTZcdTY1RTVcdTVCRjlcdThDNjFcclxuICBjb25zb2xlLmxvZyhcIlx1N0NGQlx1N0VERlx1NjZGNFx1NjVCMFx1NjVGNlx1OTVGNFwiLCBnZXROb3dEYXRlKCkpO1xyXG4gIHJldHVybiB7XHJcbiAgICBkZWZpbmU6IHtcclxuICAgICAgX19BUFBfVkVSU0lPTl9fOiBKU09OLnN0cmluZ2lmeShcInYxLjIuNVwiKSxcclxuICAgICAgX19BUFBfQlJBTkNIX186IEpTT04uc3RyaW5naWZ5KG1vZGU/LnNwbGl0Py4oXCIuXCIpWzFdKSxcclxuICAgICAgX19BUFBfVVBEQVRFX1RJTUVfXzogSlNPTi5zdHJpbmdpZnkoZ2V0Tm93RGF0ZSgpKSxcclxuICAgIH0sXHJcbiAgICBlbnZQcmVmaXg6IFwiVklURV9cIixcclxuICAgIGJhc2U6IGVudmlyb25tZW50ID09PSBcImRldmVsb3BtZW50LmRldlwiID8gXCIvXCIgOiBcIi9cIixcclxuICAgIHByb2R1Y3Rpb25Tb3VyY2VNYXA6ICFpc1Byb2R1Y3Rpb24sXHJcbiAgICBidWlsZDoge1xyXG4gICAgICBvdXREaXI6IFwiZGlzdFwiLFxyXG4gICAgICBhc3NldHNEaXI6IFwiYXNzZXRzXCIsXHJcbiAgICAgIHNvdXJjZW1hcDogZmFsc2UsXHJcbiAgICAgIG1pbmlmeTogXCJ0ZXJzZXJcIixcclxuICAgICAgY2h1bmtTaXplV2FybmluZ0xpbWl0OiAxMDI0ICogMTAsXHJcbiAgICAgIHRlcnNlck9wdGlvbnM6IHtcclxuICAgICAgICBvdXRwdXQ6IHtcclxuICAgICAgICAgIGNvbW1lbnRzOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcHJlc3M6IHtcclxuICAgICAgICAgIGRyb3BfY29uc29sZTogdHJ1ZSxcclxuICAgICAgICAgIGRyb3BfZGVidWdnZXI6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICAgIG91dHB1dDoge1xyXG4gICAgICAgICAgLy8gXHU5NzU5XHU2MDAxXHU4RDQ0XHU2RTkwXHU1MjA2XHU3QzdCXHU2MjUzXHU1MzA1XHJcbiAgICAgICAgICBjaHVua0ZpbGVOYW1lczogXCJhc3NldHMvanMvW25hbWVdLVtoYXNoXS5qc1wiLFxyXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6IFwiYXNzZXRzL2pzL1tuYW1lXS1baGFzaF0uanNcIixcclxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBcImFzc2V0cy9bZXh0XS9bbmFtZV0tW2hhc2hdLltleHRdXCIsXHJcbiAgICAgICAgICBtYW51YWxDaHVua3M6IChpZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBcdTZCRDRcdThGODNcdTU5MjdcdTc2ODRcdThENDRcdTZFOTBcdThGREJcdTg4NENcdTUyMDZcdTUzMDVcclxuICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiYW50LWRlc2lnbi12dWVcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImFudC1kc2lnbi12dWVcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiQGFudC1kZXNpZ24vaWNvbnMtdnVlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJAYW50LWRlc2lnbi9pY29ucy12dWVcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiZWNoYXJ0c1wiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZWNoYXJ0c1wiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJsb2Rhc2hcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImxvZGFzaFwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJtb21lbnQtdGltZXpvbmVcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIm1vbWVudC10aW1lem9uZVwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJheGlvc1wiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYXhpb3NcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiZGF5anNcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImRheWpzXCI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcInBpbmlhXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwaW5pYVwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJ2b2QtanMtc2RrLXY2XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ2b2QtanMtc2RrLXY2XCI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgc2VydmVyOiB7XHJcbiAgICAgIGh0dHBzOiBmYWxzZSxcclxuICAgICAgb3BlbjogZmFsc2UsXHJcbiAgICAgIGNvcnM6IHRydWUsXHJcbiAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgIGhvc3Q6IFwiMC4wLjAuMFwiLFxyXG4gICAgICBwcm94eToge1xyXG4gICAgICAgIFwiL21hcHMvYXBpXCI6IHtcclxuICAgICAgICAgIHRhcmdldDogcHJveHlBZGRyZXNzQXJyWzBdLFxyXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGg/LnJlcGxhY2U/LigvXlxcL21hcHNcXC9hcGkvLCBcIi9tYXBzL2FwaVwiKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiL2FwaVwiOiB7XHJcbiAgICAgICAgICB0YXJnZXQ6IHByb3h5X2FkZHJlc3MoZW52aXJvbm1lbnQpLFxyXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGg/LnJlcGxhY2U/LigvXlxcL2FwaS8sIFwiXCIpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgY3NzOiB7XHJcbiAgICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcclxuICAgICAgICBsZXNzOiB7XHJcbiAgICAgICAgICBtb2RpZnlWYXJzOiB7XHJcbiAgICAgICAgICAgIGhhY2s6IGB0cnVlOyBAaW1wb3J0IChyZWZlcmVuY2UpIFwiJHtyZXNvbHZlKFxyXG4gICAgICAgICAgICAgIFwic3JjL2Fzc2V0cy9jc3MvYmFzZS5sZXNzXCJcclxuICAgICAgICAgICAgKX1cIjtgLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgcmVzb2x2ZToge1xyXG4gICAgICBhbGlhczoge1xyXG4gICAgICAgIFwiQHZpZXdzXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy92aWV3c1wiKSxcclxuICAgICAgICBcIn4vXCI6IGAke3Jlc29sdmUoX19kaXJuYW1lLCBcInNyY1wiKX0vYCxcclxuICAgICAgICBcIkBcIjogcmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjXCIpLFxyXG4gICAgICAgIFwiQGFzc2V0c1wiOiByZXNvbHZlKF9fZGlybmFtZSwgXCJzcmMvYXNzZXRzXCIpLFxyXG4gICAgICAgIFwiQGNvbXBvbmVudHNcIjogcmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjL2NvbXBvbmVudHNcIiksXHJcbiAgICAgICAgXCJAaW1hZ2VzXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9hc3NldHMvaW1hZ2VzXCIpLFxyXG4gICAgICAgIFwiQHN0b3JlXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9zdG9yZVwiKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiBbXHJcbiAgICAgIHZ1ZSgpLFxyXG4gICAgICB2dWVKc3goKSxcclxuICAgICAgVnVlU2V0dXBFeHRlbmQoKSxcclxuICAgICAgLy8gXHU4MUVBXHU1MkE4XHU1QkZDXHU1MTY1YXBpXHJcbiAgICAgIEF1dG9JbXBvcnQoe1xyXG4gICAgICAgIGltcG9ydHM6IFtcclxuICAgICAgICAgIFwidnVlXCIsXHJcbiAgICAgICAgICBcInZ1ZS1yb3V0ZXJcIixcclxuICAgICAgICAgIFwicGluaWFcIixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdnVlOiBbXCJjcmVhdGVWTm9kZVwiLCBcImRlZmluZUV4cG9zZVwiLCBcIndpdGhNb2RpZmllcnNcIl0sXHJcbiAgICAgICAgICAgIFwiYW50LWRlc2lnbi12dWVcIjogW1wibWVzc2FnZVwiLCBcIk1vZGFsXCIsIFwibm90aWZpY2F0aW9uXCJdLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGluY2x1ZGU6IFsvXFwuW3RqXXN4PyQvLCAvXFwudnVlJC8sIC9cXC52dWVcXD92dWUvXSxcclxuICAgICAgICBlc2xpbnRyYzoge1xyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICBmaWxlcGF0aDogXCIuLy5lc2xpbnRyYy1hdXRvLWltcG9ydC5qc29uXCIsXHJcbiAgICAgICAgICBnbG9iYWxzUHJvcFZhbHVlOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdnVlVGVtcGxhdGU6IHRydWUsXHJcbiAgICAgICAgZGlyczogW1xyXG4gICAgICAgICAgXCIuL3NyYy9hcGlcIixcclxuICAgICAgICAgIFwiLi9zcmMvY29uZmlnXCIsXHJcbiAgICAgICAgICBcIi4vc3JjL3N0b3JlXCIsXHJcbiAgICAgICAgICBcIi4vc3JjL2Fzc2V0cy90eXBlc1wiLFxyXG4gICAgICAgICAgXCIuL3NyYy9hc3NldHMvdmFsaWRhdGVcIixcclxuICAgICAgICAgIFwiLi9zcmMvYXNzZXRzL2pzXCIsXHJcbiAgICAgICAgICBcIi4vc3JjL2Fzc2V0cy9ob2NcIixcclxuICAgICAgICBdLFxyXG4gICAgICAgIGR0czogXCIuL3NyYy90eXBlcy9hdXRvLWltcG9ydHMuZC50c1wiLFxyXG4gICAgICAgIHJlc29sdmVyczogW0FudERlc2lnblZ1ZVJlc29sdmVyKCldLFxyXG4gICAgICB9KSxcclxuICAgICAgLy8gXHU4MUVBXHU1MkE4XHU1QkZDXHU1MTY1XHU3RUM0XHU0RUY2XHJcbiAgICAgIENvbXBvbmVudHMoe1xyXG4gICAgICAgIGR0czogXCIuL3NyYy90eXBlcy9jb21wb25lbnRzLmQudHNcIixcclxuICAgICAgICBkaXJzOiBbXSxcclxuICAgICAgICBleHRlbnNpb25zOiBbXCJ2dWVcIiwgXCJqc3hcIiwgXCJ0c3hcIiwgXCJ0c1wiLCBcImpzXCJdLFxyXG4gICAgICAgIC8vIFx1NjMwOVx1OTcwMFx1NUJGQ1x1NTE2NVx1N0VDNFx1NEVGNlx1OTE0RFx1N0Y2RVx1NTNFQVx1NTcyOFx1NkEyMVx1NzI0OFx1OEJFRFx1NkNENVx1NEUyRFx1NzUxRlx1NjU0OFxyXG4gICAgICAgIHJlc29sdmVyczogW1xyXG4gICAgICAgICAgQW50RGVzaWduVnVlUmVzb2x2ZXIoeyBpbXBvcnRTdHlsZTogdHJ1ZSwgcmVzb2x2ZUljb25zOiB0cnVlIH0pLFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pLFxyXG4gICAgICBzdmdCdWlsZGVyKFwiLi9zcmMvYXNzZXRzL2ljb25zL3N2Zy9cIiksXHJcbiAgICAgIHRpbmlmeUltZygpLFxyXG4gICAgICBjaGVja2VyKHtcclxuICAgICAgICB2dWVUc2M6IHRydWUsXHJcbiAgICAgIH0pLFxyXG4gICAgXSxcclxuICB9O1xyXG59KTtcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFxwbHVnaW5zXFxcXHN2Z0J1aWxkZXIuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFNiU5RSU4MSVFNSU4NSU4OSVFNiU5NyVCQi9pbV9iYWNrc3RhZ2Uvc3JjL3BsdWdpbnMvc3ZnQnVpbGRlci5qc1wiO2ltcG9ydCB7IHJlYWRGaWxlU3luYywgcmVhZGRpclN5bmMgfSBmcm9tIFwiZnNcIjtcclxuXHJcbmxldCBpZFBlcmZpeCA9IFwiXCI7XHJcbmNvbnN0IHN2Z1RpdGxlID0gLzxzdmcoW14+K10uKj8pPi87XHJcbmNvbnN0IGNsZWFySGVpZ2h0V2lkdGggPSAvKHdpZHRofGhlaWdodCk9XCIoW14+K10uKj8pXCIvZztcclxuXHJcbmNvbnN0IGhhc1ZpZXdCb3ggPSAvKHZpZXdCb3g9XCJbXj4rXS4qP1wiKS9nO1xyXG5cclxuY29uc3QgY2xlYXJSZXR1cm4gPSAvKFxccil8KFxcbikvZztcclxuXHJcbmZ1bmN0aW9uIGZpbmRTdmdGaWxlKGRpcikge1xyXG4gIGNvbnN0IHN2Z1JlcyA9IFtdO1xyXG4gIGNvbnN0IGRpcmVudHMgPSByZWFkZGlyU3luYyhkaXIsIHtcclxuICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXHJcbiAgfSk7XHJcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xyXG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgIHN2Z1Jlcy5wdXNoKC4uLmZpbmRTdmdGaWxlKGRpciArIGRpcmVudC5uYW1lICsgXCIvXCIpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHN2ZyA9IHJlYWRGaWxlU3luYyhkaXIgKyBkaXJlbnQubmFtZSlcclxuICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgID8ucmVwbGFjZShjbGVhclJldHVybiwgXCJcIilcclxuICAgICAgICA/LnJlcGxhY2Uoc3ZnVGl0bGUsICgkMSwgJDIpID0+IHtcclxuICAgICAgICAgIGxldCB3aWR0aCA9IDA7XHJcbiAgICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcclxuICAgICAgICAgIGxldCBjb250ZW50ID0gJDI/LnJlcGxhY2UoY2xlYXJIZWlnaHRXaWR0aCwgKHMxLCBzMiwgczMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHMyID09PSBcIndpZHRoXCIpIHtcclxuICAgICAgICAgICAgICB3aWR0aCA9IHMzO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHMyID09PSBcImhlaWdodFwiKSB7XHJcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gczM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmICghaGFzVmlld0JveC50ZXN0KCQyKSkge1xyXG4gICAgICAgICAgICBjb250ZW50ICs9IGB2aWV3Qm94PVwiMCAwICR7d2lkdGh9ICR7aGVpZ2h0fVwiYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBgPHN5bWJvbCBpZD1cIiR7aWRQZXJmaXh9LSR7ZGlyZW50Lm5hbWU/LnJlcGxhY2UoXHJcbiAgICAgICAgICAgIFwiLnN2Z1wiLFxyXG4gICAgICAgICAgICBcIlwiXHJcbiAgICAgICAgICApfVwiICR7Y29udGVudH0+YDtcclxuICAgICAgICB9KVxyXG4gICAgICAgID8ucmVwbGFjZShcIjwvc3ZnPlwiLCBcIjwvc3ltYm9sPlwiKTtcclxuICAgICAgc3ZnUmVzLnB1c2goc3ZnKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHN2Z1JlcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHN2Z0J1aWxkZXIgPSAocGF0aCwgcGVyZml4ID0gXCJpY29uXCIpID0+IHtcclxuICBpZiAocGF0aCA9PT0gXCJcIikgcmV0dXJuO1xyXG4gIGlkUGVyZml4ID0gcGVyZml4O1xyXG4gIGNvbnN0IHJlcyA9IGZpbmRTdmdGaWxlKHBhdGgpO1xyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lOiBcInN2Zy10cmFuc2Zvcm1cIixcclxuICAgIHRyYW5zZm9ybUluZGV4SHRtbChodG1sKSB7XHJcbiAgICAgIHJldHVybiBodG1sPy5yZXBsYWNlKFxyXG4gICAgICAgIFwiPGJvZHk+XCIsXHJcbiAgICAgICAgYFxyXG4gICAgICAgICAgPGJvZHk+XHJcbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMDsgaGVpZ2h0OiAwXCI+XHJcbiAgICAgICAgICAgICAgJHtyZXMuam9pbihcIlwiKX1cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgYFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICB9O1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHV0aWxzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFx1dGlsc1xcXFx0b29scy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS9zcmMvdXRpbHMvdG9vbHMudHNcIjtpbXBvcnQgdHlwZSB7IEloYW5kbGVyLCBFeHRlbmRlZERvY3VtZW50IH0gZnJvbSBcIkAvdHlwZXMvdXRpbHMvZG9tXCI7XHJcbmV4cG9ydCBjb25zdCBjaGVja0Z1bGwgPSAoKSA9PiB7XHJcbiAgY29uc3QgaHRtbERvY3VtZW50OiBFeHRlbmRlZERvY3VtZW50ID0gZG9jdW1lbnQ7XHJcbiAgY29uc3QgaXNGdWxsID1cclxuICAgIGh0bWxEb2N1bWVudC5tb3pGdWxsU2NyZWVuIHx8XHJcbiAgICBodG1sRG9jdW1lbnQuZnVsbFNjcmVlbiB8fFxyXG4gICAgaHRtbERvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbiB8fFxyXG4gICAgaHRtbERvY3VtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIHx8XHJcbiAgICBodG1sRG9jdW1lbnQubW96UmVxdWVzdEZ1bGxTY3JlZW4gfHxcclxuICAgIGh0bWxEb2N1bWVudC5tc0Z1bGxzY3JlZW5FbmFibGVkO1xyXG4gIHJldHVybiAhIWlzRnVsbDtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBXaW5kb3dSZXNpemVDaGFuZ2Uge1xyXG4gIHByaXZhdGUgcmVzaXplVGhyb3R0bGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBkZWxheTogbnVtYmVyO1xyXG4gIHB1YmxpYyBjYWxsYmFjazogYW55ID0gKCkgPT4ge307XHJcbiAgY29uc3RydWN0b3IoaGFuZGxlcjogSWhhbmRsZXIsIGRlbGF5ID0gMjUwKSB7XHJcbiAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XHJcbiAgICAvLyBcdTUxOTlcdTZDRDUxXHJcbiAgICAvKmNvbnN0IHsgaGFuZGxlUmVzaXplIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaGFuZGxlUmVzaXplLmJpbmQodGhpcywgaGFuZGxlcik7XHJcbiAgICBmdW5jdGlvbk5hbWUoKTsqL1xyXG4gICAgLy8gXHU1MTk5XHU2Q0Q1MlxyXG4gICAgdGhpcy5oYW5kbGVSZXNpemUoaGFuZGxlcik7XHJcbiAgfVxyXG4gIGNoZWNrSXNNb2JpbGUoKSB7XHJcbiAgICBjb25zdCBjbGllbnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgcmV0dXJuIGNsaWVudFdpZHRoIDw9IDc1MDtcclxuICB9XHJcbiAgcmVzaXplTGlzdGVuZXIoaGFuZGxlcjogSWhhbmRsZXIpIHtcclxuICAgIGxldCB7IGRlbGF5LCBjaGVja0lzTW9iaWxlIH0gPSB0aGlzO1xyXG4gICAgaWYgKCF0aGlzLnJlc2l6ZVRocm90dGxlZCkge1xyXG4gICAgICB0aGlzLnJlc2l6ZVRocm90dGxlZCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaGFuZGxlcihjaGVja0lzTW9iaWxlKCkpO1xyXG4gICAgICAgIHRoaXMucmVzaXplVGhyb3R0bGVkID0gZmFsc2U7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgfSwgZGVsYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBoYW5kbGVSZXNpemUoaGFuZGxlcjogSWhhbmRsZXIpIHtcclxuICAgIGNvbnN0IHsgcmVzaXplTGlzdGVuZXIgfSA9IHRoaXM7XHJcbiAgICB0aGlzLmNhbGxiYWNrID0gcmVzaXplTGlzdGVuZXIuYmluZCh0aGlzLCBoYW5kbGVyKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuY2FsbGJhY2ssIGZhbHNlKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShzaXplOiBudW1iZXIsIHBvaW50TGVuZ3RoID0gMikge1xyXG4gIGlmIChzaXplIDwgMTAyNCkge1xyXG4gICAgcmV0dXJuIHNpemUgKyBcIkJcIjtcclxuICB9IGVsc2UgaWYgKHNpemUgPCAxMDI0ICogMTAyNCkge1xyXG4gICAgcmV0dXJuIChzaXplIC8gMTAyNCkudG9GaXhlZChwb2ludExlbmd0aCkgKyBcIktCXCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKHBvaW50TGVuZ3RoKSArIFwiTUJcIjtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGaWxlTG9jYWxVcmwgPSAoZmlsZTogRmlsZSk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZTogYW55KSB7XHJcbiAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcclxuICAgIH07XHJcbiAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uIChlOiBhbnkpIHtcclxuICAgICAgcmVqZWN0KGUpO1xyXG4gICAgfTtcclxuICB9KTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGdldEZpbGVOYW1lID0gKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgYXJyID0gdXJsLnNwbGl0KFwiL1wiKTtcclxuICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcclxufTtcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFxwbHVnaW5zXFxcXHRpbmlmeUltZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS9zcmMvcGx1Z2lucy90aW5pZnlJbWcudHNcIjtpbXBvcnQgeyBmb3JtYXRGaWxlU2l6ZSBhcyBmb3JtYXRTaXplIH0gZnJvbSBcIi4uL3V0aWxzL3Rvb2xzXCI7XHJcbmltcG9ydCB7IHJlYWRGaWxlLCBzdGF0IH0gZnJvbSBcImZzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XHJcbmltcG9ydCBzaGFycCBmcm9tIFwic2hhcnBcIjtcclxudHlwZSBJbWdUeXBlID0gXCJwbmdcIiB8IFwianBlZ1wiIHwgXCJnaWZcIiB8IFwid2VicFwiO1xyXG5pbnRlcmZhY2UgSW1nRmlsZSB7XHJcbiAgc2l6ZTogc3RyaW5nO1xyXG4gIHVybDogc3RyaW5nO1xyXG59XHJcbmxldCBoYXNoQ29ubmVjdCA9IFwiLVwiO1xyXG5sZXQgaGFzaExlbmd0aCA9IDg7XHJcbmxldCBpc05lZWRIYXNoID0gdHJ1ZTtcclxubGV0IGFzc2V0c0lubGluZUxpbWl0ID0gNDA5NjtcclxuY29uc3QgaW1nRmlsZU1hcDoge1xyXG4gIFtrZXk6IHN0cmluZ106IEltZ0ZpbGU7XHJcbn0gPSB7fTtcclxuY29uc3QgaW1hZ2VSZWdleCA9IC9cXC4ocG5nfGpwZT9nfGdpZnx3ZWJwKSQvaTtcclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlSGFzaChjb250ZW50OiBzdHJpbmcgfCBCdWZmZXIpIHtcclxuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoY29udGVudCkuZGlnZXN0KFwiaGV4XCIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRGaWxlRXh0KGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICByZXR1cm4gZmlsZVBhdGguc3BsaXQoXCIuXCIpLnBvcCgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRGaWxlTmFtZShmaWxlUGF0aDogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIGZpbGVQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVIYXNoRmlsZU5hbWUoXHJcbiAgZmlsZVBhdGg6IHN0cmluZyxcclxuICBpc0Nvbm5lY3RIYXNoOiBib29sZWFuLFxyXG4gIGhhc2hMZW46IG51bWJlcixcclxuICBoYXNoOiBzdHJpbmdcclxuKSB7XHJcbiAgY29uc3QgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShmaWxlUGF0aCkgYXMgc3RyaW5nO1xyXG4gIGNvbnN0IGV4dCA9IGdldEZpbGVFeHQoZmlsZU5hbWUpO1xyXG4gIHJldHVybiBpc0Nvbm5lY3RIYXNoXHJcbiAgICA/IGAke2ZpbGVOYW1lLnJlcGxhY2UoYC4ke2V4dH1gLCBcIlwiKX0ke2hhc2hDb25uZWN0fSR7aGFzaC5zbGljZShcclxuICAgICAgICAwLFxyXG4gICAgICAgIGhhc2hMZW5cclxuICAgICAgKX0uJHtleHR9YFxyXG4gICAgOiBgJHtmaWxlTmFtZS5yZXBsYWNlKGAuJHtleHR9YCwgXCJcIil9LiR7ZXh0fWA7XHJcbn1cclxuZnVuY3Rpb24gZ2V0RmlsZVNpemUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdm9pZD4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgc3RhdChmaWxlUGF0aCwgKGVyciwgc3RhdHMpID0+IHtcclxuICAgICAgaWYgKGVycikgcmVzb2x2ZSh2b2lkIDApO1xyXG4gICAgICByZXNvbHZlKHN0YXRzLnNpemUpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICByZWFkRmlsZShmaWxlUGF0aCwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICBpZiAoZXJyKSByZXNvbHZlKHZvaWQgMCk7XHJcbiAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZm9ybWF0dGVyTG9nKGZpbGVQYXRoOiBzdHJpbmcsIHNpemVCZWZvcmU6IHN0cmluZywgc2l6ZUFmdGVyOiBzdHJpbmcpIHtcclxuICBjb25zb2xlLmxvZyhcclxuICAgIFwiXFxuXFx4MUJbMzRtXCIsXHJcbiAgICBgXHUzMDEwJHtmaWxlUGF0aH1cdTMwMTFcdTUzOEJcdTdGMjlcdTYyMTBcdTUyOUZgLFxyXG4gICAgXCJcXHgxQlswbVwiLFxyXG4gICAgXCJcXHgxQlszMW1cIixcclxuICAgIHNpemVCZWZvcmUsXHJcbiAgICBcIlxceDFCWzBtXCIsXHJcbiAgICBcIj09PT5cIixcclxuICAgIFwiXFx4MUJbMzJtXCIsXHJcbiAgICBzaXplQWZ0ZXIsXHJcbiAgICBcIlxceDFCWzBtXCJcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0aW5pZnlJbWcoaW1nRmlsZTogSW1nRmlsZSk6IGFueSB7XHJcbiAgY29uc3QgeyBzaXplLCB1cmw6IGZpbGVQYXRoIH0gPSBpbWdGaWxlO1xyXG4gIGNvbnN0IGV4dDogSW1nVHlwZSA9IGdldEZpbGVFeHQoZmlsZVBhdGgpIGFzIEltZ1R5cGU7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBzd2l0Y2ggKGV4dCkge1xyXG4gICAgICBjYXNlIFwicG5nXCI6XHJcbiAgICAgICAgc2hhcnAoZmlsZVBhdGgsIHsgbGltaXRJbnB1dFBpeGVsczogZmFsc2UgfSlcclxuICAgICAgICAgIC5wbmcoeyBxdWFsaXR5OiAxMCB9KVxyXG4gICAgICAgICAgLnRvQnVmZmVyKChlcnIsIGRhdGEsIGluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG5cXHgxQlszMW1cdTMwMTAke2ZpbGVQYXRofVx1MzAxMVx1NTM4Qlx1N0YyOVx1NTkzMVx1OEQyNVxceDFCWzBtYCwgZXJyKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHZvaWQgMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZm9ybWF0dGVyTG9nKGZpbGVQYXRoLCBzaXplLCBmb3JtYXRTaXplKGluZm8uc2l6ZSkpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwianBlZ1wiOlxyXG4gICAgICAgIHNoYXJwKGZpbGVQYXRoLCB7IGxpbWl0SW5wdXRQaXhlbHM6IGZhbHNlIH0pXHJcbiAgICAgICAgICAuanBlZyh7IHF1YWxpdHk6IDEwIH0pXHJcbiAgICAgICAgICAudG9CdWZmZXIoKGVyciwgZGF0YSwgaW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYFxcblxceDFCWzMxbVx1MzAxMCR7ZmlsZVBhdGh9XHUzMDExXHU1MzhCXHU3RjI5XHU1OTMxXHU4RDI1XFx4MUJbMG1gLCBlcnIpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmb3JtYXR0ZXJMb2coZmlsZVBhdGgsIHNpemUsIGZvcm1hdFNpemUoaW5mby5zaXplKSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJnaWZcIjpcclxuICAgICAgICBzaGFycChmaWxlUGF0aCwgeyBhbmltYXRlZDogdHJ1ZSwgbGltaXRJbnB1dFBpeGVsczogZmFsc2UgfSlcclxuICAgICAgICAgIC5naWYoeyBpbnRlckZyYW1lTWF4RXJyb3I6IDEwLCBjb2xvdXJzOiAyMDAgfSlcclxuICAgICAgICAgIC50b0J1ZmZlcigoZXJyLCBkYXRhLCBpbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuXFx4MUJbMzFtXHUzMDEwJHtmaWxlUGF0aH1cdTMwMTFcdTUzOEJcdTdGMjlcdTU5MzFcdThEMjVcXHgxQlswbWAsIGVycik7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh2b2lkIDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvcm1hdHRlckxvZyhmaWxlUGF0aCwgc2l6ZSwgZm9ybWF0U2l6ZShpbmZvLnNpemUpKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIndlYnBcIjpcclxuICAgICAgICBzaGFycChmaWxlUGF0aCwgeyBsaW1pdElucHV0UGl4ZWxzOiBmYWxzZSB9KVxyXG4gICAgICAgICAgLndlYnAoeyBxdWFsaXR5OiAxMCB9KVxyXG4gICAgICAgICAgLnRvQnVmZmVyKChlcnIsIGRhdGEsIGluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG5cXHgxQlszMW1cdTMwMTAke2ZpbGVQYXRofVx1MzAxMVx1NTM4Qlx1N0YyOVx1NTkzMVx1OEQyNVxceDFCWzBtYCwgZXJyKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHZvaWQgMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZm9ybWF0dGVyTG9nKGZpbGVQYXRoLCBzaXplLCBmb3JtYXRTaXplKGluZm8uc2l6ZSkpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJlc29sdmUodm9pZCAwKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG5hbWU6IFwidml0ZS1wbHVnaW4tdGluaWZ5LWltYWdlXCIsXHJcbiAgICBlbmZvcmNlOiBcInByZVwiLCAvLyBcdTU3MjhcdTUxNzZcdTRFRDZcdTYzRDJcdTRFRjZcdTU5MDRcdTc0MDZcdTRFNEJcdTUyNERcdUZGMENcdTUxNDhcdTU5MDRcdTc0MDZcclxuICAgIGFwcGx5OiBcImJ1aWxkXCIsIC8vIFx1NTNFQVx1NTcyOFx1NzUxRlx1NEVBN1x1NzNBRlx1NTg4M1x1Njc4NFx1NUVGQVx1NjVGNlx1NTQyRlx1NzUyOFxyXG4gICAgYXN5bmMgY29uZmlnUmVzb2x2ZWQoY29uZmlnOiBhbnkpIHtcclxuICAgICAgYXNzZXRzSW5saW5lTGltaXQgPSBjb25maWcuYnVpbGQuYXNzZXRzSW5saW5lTGltaXQ7XHJcbiAgICAgIGNvbnN0IGFzc2V0RmlsZU5hbWVzID1cclxuICAgICAgICBjb25maWc/LmJ1aWxkPy5yb2xsdXBPcHRpb25zPy5vdXRwdXQ/LmFzc2V0RmlsZU5hbWVzO1xyXG4gICAgICBpZiAoYXNzZXRGaWxlTmFtZXMpIHtcclxuICAgICAgICBpZiAoL1xcW2hhc2g6PyhcXGQqKVxcXS8udGVzdChhc3NldEZpbGVOYW1lcykpIHtcclxuICAgICAgICAgIGhhc2hDb25uZWN0ID0gXCJcIjtcclxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzLnJlcGxhY2UoXHJcbiAgICAgICAgICAgIC9cXFtuYW1lXFxdKC4pXFxbaGFzaDo/KFxcZCopXFxdLyxcclxuICAgICAgICAgICAgKG1hdGNoOiBzdHJpbmcsICQxOiBzdHJpbmcsICQyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBoYXNoQ29ubmVjdCA9ICQxO1xyXG4gICAgICAgICAgICAgIGhhc2hMZW5ndGggPSBOdW1iZXIoJDIpIHx8IDg7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlzTmVlZEhhc2ggPSBmYWxzZTtcclxuICAgICAgICAgIGhhc2hDb25uZWN0ID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGFzaENvbm5lY3QgPSBcIi1cIjtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGFzeW5jIGxvYWQoaWQ6IHN0cmluZykge1xyXG4gICAgICBpZiAoaW1hZ2VSZWdleC50ZXN0KGlkKSkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBhd2FpdCBnZXRGaWxlU2l6ZShpZCk7XHJcbiAgICAgICAgaWYgKHNpemUgJiYgc2l6ZSA+IGFzc2V0c0lubGluZUxpbWl0KSB7XHJcbiAgICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHJlYWRGaWxlQ29udGVudChpZCk7XHJcbiAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIGltZ0ZpbGVNYXBbXHJcbiAgICAgICAgICAgICAgZ2VuZXJhdGVIYXNoRmlsZU5hbWUoXHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIGlzTmVlZEhhc2gsXHJcbiAgICAgICAgICAgICAgICBoYXNoTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVIYXNoKHJlcylcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIF0gPSB7XHJcbiAgICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShzaXplKSxcclxuICAgICAgICAgICAgICB1cmw6IGlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGFzeW5jIGdlbmVyYXRlQnVuZGxlKF9vcHRpb25zOiBhbnksIGJ1bmRsZTogYW55KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiXFxuPT09PT09PT09PT09PT09XHU1RjAwXHU1OUNCXHU1NkZFXHU3MjQ3XHU1MzhCXHU3RjI5PT09PT09PT09PT09PT1cIik7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGJ1bmRsZSkge1xyXG4gICAgICAgIGlmIChpbWFnZVJlZ2V4LnRlc3Qoa2V5KSkge1xyXG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShrZXkpO1xyXG4gICAgICAgICAgaWYgKGZpbGVOYW1lICYmIGltZ0ZpbGVNYXBbZmlsZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRpbmlmeUltZyhpbWdGaWxlTWFwW2ZpbGVOYW1lXSk7XHJcbiAgICAgICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgICAgICBidW5kbGVba2V5XS5zb3VyY2UgPSByZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJcXG49PT09PT09PT09PT09PT1cdTVCOENcdTYyMTBcdTU2RkVcdTcyNDdcdTUzOEJcdTdGMjk9PT09PT09PT09PT09PVwiKTtcclxuICAgIH0sXHJcbiAgfTtcclxufTtcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY3ODFcdTUxNDlcdTY1RkJcXFxcaW1fYmFja3N0YWdlXFxcXHNyY1xcXFxjb25maWdcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXGNvbmZpZ1xcXFxzeXN0ZW0udHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6LyVFNiU5RSU4MSVFNSU4NSU4OSVFNiU5NyVCQi9pbV9iYWNrc3RhZ2Uvc3JjL2NvbmZpZy9zeXN0ZW0udHNcIjtleHBvcnQgY29uc3QgZ2V0Tm93RGF0ZSA9ICgpID0+IHtcclxuICB2YXIgZGF0ZTogYW55ID0gbmV3IERhdGUoKTtcclxuICB2YXIgc2lnbjI6IGFueSA9IFwiOlwiO1xyXG4gIHZhciB5ZWFyOiBhbnkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7IC8vIFx1NUU3NFxyXG4gIHZhciBtb250aDogYW55ID0gZGF0ZS5nZXRNb250aCgpICsgMTsgLy8gXHU2NzA4XHJcbiAgdmFyIGRheTogYW55ID0gZGF0ZS5nZXREYXRlKCk7IC8vIFx1NjVFNVxyXG4gIHZhciBob3VyOiBhbnkgPSBkYXRlLmdldEhvdXJzKCk7IC8vIFx1NjVGNlxyXG4gIHZhciBtaW51dGVzOiBhbnkgPSBkYXRlLmdldE1pbnV0ZXMoKTsgLy8gXHU1MjA2XHJcbiAgdmFyIHNlY29uZHM6IGFueSA9IGRhdGUuZ2V0U2Vjb25kcygpOyAvL1x1NzlEMlxyXG4gIHZhciB3ZWVrQXJyOiBhbnkgPSBbXHJcbiAgICBcIlx1NjYxRlx1NjcxRlx1NTkyOVwiLFxyXG4gICAgXCJcdTY2MUZcdTY3MUZcdTRFMDBcIixcclxuICAgIFwiXHU2NjFGXHU2NzFGXHU0RThDXCIsXHJcbiAgICBcIlx1NjYxRlx1NjcxRlx1NEUwOVwiLFxyXG4gICAgXCJcdTY2MUZcdTY3MUZcdTU2REJcIixcclxuICAgIFwiXHU2NjFGXHU2NzFGXHU0RTk0XCIsXHJcbiAgICBcIlx1NjYxRlx1NjcxRlx1NTE2RFwiLFxyXG4gIF07XHJcbiAgdmFyIHdlZWs6IGFueSA9IHdlZWtBcnJbZGF0ZS5nZXREYXkoKV07XHJcbiAgLy8gXHU3RUQ5XHU0RTAwXHU0RjREXHU2NTcwXHU3Njg0XHU2NTcwXHU2MzZFXHU1MjREXHU5NzYyXHU1MkEwIFx1MjAxQzBcdTIwMURcclxuICBpZiAobW9udGggPj0gMSAmJiBtb250aCA8PSA5KSBtb250aCA9IFwiMFwiICsgbW9udGg7XHJcbiAgaWYgKGRheSA+PSAwICYmIGRheSA8PSA5KSBkYXkgPSBcIjBcIiArIGRheTtcclxuICBpZiAoaG91ciA+PSAwICYmIGhvdXIgPD0gOSkgaG91ciA9IFwiMFwiICsgaG91cjtcclxuICBpZiAobWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gOSkgbWludXRlcyA9IFwiMFwiICsgbWludXRlcztcclxuICBpZiAoc2Vjb25kcyA+PSAwICYmIHNlY29uZHMgPD0gOSkgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcclxuICByZXR1cm4gKFxyXG4gICAgeWVhciArXHJcbiAgICBcIi1cIiArXHJcbiAgICBtb250aCArXHJcbiAgICBcIi1cIiArXHJcbiAgICBkYXkgK1xyXG4gICAgXCIgXCIgK1xyXG4gICAgaG91ciArXHJcbiAgICBzaWduMiArXHJcbiAgICBtaW51dGVzICtcclxuICAgIHNpZ24yICtcclxuICAgIHNlY29uZHMgK1xyXG4gICAgXCIgXCIgK1xyXG4gICAg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LFFBQ0EsYUFBYTtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0o7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLO0FBQUEsUUFDTCxXQUFXLENBQUMscUJBQXFCLENBQUM7QUFBQSxNQUNwQyxDQUFDO0FBQUE7QUFBQSxNQUVELFdBQVc7QUFBQSxRQUNULEtBQUs7QUFBQSxRQUNMLE1BQU0sQ0FBQztBQUFBLFFBQ1AsWUFBWSxDQUFDLE9BQU8sT0FBTyxPQUFPLE1BQU0sSUFBSTtBQUFBO0FBQUEsUUFFNUMsV0FBVztBQUFBLFVBQ1QscUJBQXFCLEVBQUUsYUFBYSxNQUFNLGNBQWMsS0FBSyxDQUFDO0FBQUEsUUFDaEU7QUFBQSxNQUNGLENBQUM7QUFBQSxNQUNELFdBQVcseUJBQXlCO0FBQUEsTUFDcEMsa0JBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxRQUNOLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbIl9hIiwgIl9iIiwgIl9jIiwgInJlc29sdmUiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2EiXQp9Cg==
